package com.xinzhi.controller;

import cn.hutool.json.JSONUtil;
import com.xinzhi.utlis.Result;
import com.xinzhi.pojo.User;
import com.xinzhi.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpSession;
import java.util.Random;
import java.util.concurrent.TimeUnit;

@RestController
@CrossOrigin
@RequestMapping("/user")
public class UserController {
    @Autowired
    private IUserService userService;
    @Autowired
    private RedisTemplate<String,Object> redisTemplate;
    public Random random = new Random();

    /**
     * 发送验证码
     * @param phonenumber
     * @return
     */
    @PostMapping("/send")
    public Result sendCode(@RequestParam(value = "phonenumber") String phonenumber) {
        if (phonenumber == null){
            return Result.error("手机号不能为空");
        }
        //调用发送的方法即可
        //1、连接Redis，查找手机验证码是否存在
        String code = (String)redisTemplate.opsForValue().get(phonenumber);
        // 1、1如果存在的话，说明在5分钟内已经发送过验证码了，不能再发了
        if (!StringUtils.isEmpty(code)) {
            System.out.println("已存在，还没有过期，不能再次发送");
            return Result.error(phonenumber+":"+code+" 已存在，还没有过期");
        }
        //1。2 如果不存在的话,那么redis创建键值对生成验证码并存储，设置过期时间
        // 生成6位随机验证码
        String newCode ="";
        for (int i = 0; i < 6; i++) {
            newCode += random.nextInt(10);
        }
        // 将6位随机验证码对手机号进行发送,存储发送的boolean结果(true和false)
        boolean idSend = userService.send(phonenumber,"1958490",newCode);
        // 因为有短信轰炸的情况，短信服务对每次发送限制次数，所以有发送不成功的情况，要考虑
        if(idSend){
            //如果发送成功将验证码存储到redis中
            redisTemplate.opsForValue().set(phonenumber,JSONUtil.toJsonStr(newCode), 600, TimeUnit.MINUTES);
            System.out.println("发送成功!");
            return Result.ok(phonenumber+":"+newCode+" 发送成功!");
        }else{
            System.out.println("发送失败!");
            return Result.error("发送失败!");
        }

    }

    /**
     * 忘记密码
     * @param user
     * @param session
     * @return
     */
    @RequestMapping("/Forgot")
    public Result Forgot(@RequestBody User user, HttpSession session){
        String phonenumber = user.getPhonenumber();
        String message = user.getMessage();
        String onepassword = user.getOnepassword();
        String twopassword = user.getTwopassword();
        //拿出Redis中的验证码
        String code = (String)redisTemplate.opsForValue().get(user.getPhonenumber());
        if (message!=null && code!=null&&message.equals(code)){
            return userService.forgetpassword(phonenumber,onepassword,twopassword);
        }
        return Result.error("错误");
    }

    /**
     * 修改密码
     * @param user
     * @param session
     * @return
     */
    @RequestMapping("/update")
    public Result update(@RequestBody User user,HttpSession session){
        return userService.updatepassword(user,session);
    }
}